// 字面量类型:类似于const
let e : 10;
e = 10
// e = 11;      //报错

// 可以用 | 连接多个类型(联合类型)
let f :'male' | 'female';
f = 'male'

let g : number | string;
g = 10
g = 'hello world'
// g = true     //报错

// any 表示的是任意类型，可以任意赋值；
// 一个变量设置类型为any后相当于对该变量关闭了TS的类型检测
let h : any;
h = 10
h = 'hello world'
h = true

// unknown 表示位置类型的值
let i : unknown;
i = 10
i = 'hello world'
i = true

// 阐述 unknown 和 any 的区别
let test :string
test = h    //h的类型是any，可以赋值给任何变量 这样就会导致出问题了。
// test = i    //这里会有错误提示
// unknown 实际上就是一个类型安全的any
// unknown类型的变量，不能直接赋值给其他变量
// 如果就像把 i 赋值给test 可以这样写
if(typeof i === 'string'){
    test = i
}
// 类型断言，强制转换类型
test = i as string
test = <string>i    //第二种写法

// void
function fn(){
    // fn的返回值类型根据你返回的值是什么类型就什么类型；
    // 如果没有返回值 默认为 void
}

function fn1 (): void{
    // 函数没有返回值
    // return 1         //这个会报错，因为函数的返回值类型必须为空
    return undefined
    return
}
// never 也没有任何的返回值，是专门用于程序出错，报错。
function fn2() : never{
    throw new Error('error')
}